From d4c5b9db5a8566ed7d958a8d20e31532acab7be1 Mon Sep 17 00:00:00 2001 From: Eddie Dong Date: Thu, 9 Jun 2011 16:24:09 +0800 Subject: [PATCH] Nested VMX: Emulation of guest VMWRITE Signed-off-by: Qing He Signed-off-by: Eddie Dong Signed-off-by: Tim Deegan Committed-by: Tim Deegan --- xen/arch/x86/hvm/vmx/vmx.c | 6 +++++- xen/arch/x86/hvm/vmx/vvmx.c | 25 +++++++++++++++++++++++++ xen/include/asm-x86/hvm/vmx/vvmx.h | 1 + 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 93f46a7ce8..760d0053b0 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2454,12 +2454,16 @@ asmlinkage void vmx_vmexit_handler(struct cpu_user_regs *regs) update_guest_eip(); break; + case EXIT_REASON_VMWRITE: + if ( nvmx_handle_vmwrite(regs) == X86EMUL_OKAY ) + update_guest_eip(); + break; + case EXIT_REASON_MWAIT_INSTRUCTION: case EXIT_REASON_MONITOR_INSTRUCTION: case EXIT_REASON_VMLAUNCH: case EXIT_REASON_VMREAD: case EXIT_REASON_VMRESUME: - case EXIT_REASON_VMWRITE: case EXIT_REASON_GETSEC: case EXIT_REASON_INVEPT: case EXIT_REASON_INVVPID: diff --git a/xen/arch/x86/hvm/vmx/vvmx.c b/xen/arch/x86/hvm/vmx/vvmx.c index 1a4a2519a1..196f146c7c 100644 --- a/xen/arch/x86/hvm/vmx/vvmx.c +++ b/xen/arch/x86/hvm/vmx/vvmx.c @@ -548,3 +548,28 @@ out: return X86EMUL_OKAY; } +int nvmx_handle_vmwrite(struct cpu_user_regs *regs) +{ + struct vcpu *v = current; + struct vmx_inst_decoded decode; + struct nestedvcpu *nvcpu = &vcpu_nestedhvm(v); + unsigned long operand; + u64 vmcs_encoding; + + if ( decode_vmx_inst(regs, &decode, &operand, 0) + != X86EMUL_OKAY ) + return X86EMUL_EXCEPTION; + + vmcs_encoding = reg_read(regs, decode.reg2); + __set_vvmcs(nvcpu->nv_vvmcx, vmcs_encoding, operand); + + if ( vmcs_encoding == IO_BITMAP_A || vmcs_encoding == IO_BITMAP_A_HIGH ) + __map_io_bitmap (v, IO_BITMAP_A); + else if ( vmcs_encoding == IO_BITMAP_B || + vmcs_encoding == IO_BITMAP_B_HIGH ) + __map_io_bitmap (v, IO_BITMAP_B); + + vmreturn(regs, VMSUCCEED); + return X86EMUL_OKAY; +} + diff --git a/xen/include/asm-x86/hvm/vmx/vvmx.h b/xen/include/asm-x86/hvm/vmx/vvmx.h index 3533a4e546..3ade6dc89e 100644 --- a/xen/include/asm-x86/hvm/vmx/vvmx.h +++ b/xen/include/asm-x86/hvm/vmx/vvmx.h @@ -156,6 +156,7 @@ void nvmx_destroy_vmcs(struct vcpu *v); int nvmx_handle_vmptrld(struct cpu_user_regs *regs); int nvmx_handle_vmptrst(struct cpu_user_regs *regs); int nvmx_handle_vmclear(struct cpu_user_regs *regs); +int nvmx_handle_vmwrite(struct cpu_user_regs *regs); #endif /* __ASM_X86_HVM_VVMX_H__ */ -- 2.30.2